package com.mall.module.product.mapper;

import com.mall.module.product.domain.dto.ProductSpuPageQueryDTO;
import com.mall.module.product.domain.entity.ProductSpu;
import com.mall.module.product.domain.vo.NewProductVO;
import com.mall.module.product.domain.vo.ProductSpuVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 商品SPU数据访问层
 */
@Mapper
public interface ProductSpuMapper {
    /**
     * 插入商品SPU
     *
     * @param productSpu 商品SPU实体
     * @return 影响行数
     */
    int insert(ProductSpu productSpu);
    
    /**
     * 更新商品SPU
     *
     * @param productSpu 商品SPU实体
     * @return 影响行数
     */
    int update(ProductSpu productSpu);
    
    /**
     * 根据ID查询商品SPU
     *
     * @param id 商品ID
     * @return 商品SPU实体
     */
    ProductSpu selectById(Long id);
    
    /**
     * 逻辑删除商品SPU
     *
     * @param id 商品ID
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id, @Param("updaterId") Long updaterId);
    
    /**
     * 分页查询商品SPU列表
     *
     * @param queryDTO 查询条件
     * @return 商品SPU列表
     */
    List<ProductSpuVO> selectPage(ProductSpuPageQueryDTO queryDTO);
    
    /**
     * 查询商品SPU列表
     *
     * @param condition 查询条件
     * @return 商品SPU列表
     */
    List<ProductSpuVO> selectList(ProductSpu condition);
    
    /**
     * 根据分类ID查询商品SPU列表
     *
     * @param categoryId 分类ID
     * @return 商品SPU列表
     */
    List<ProductSpuVO> selectByCategory(Long categoryId);
    
    /**
     * 根据品牌ID查询商品SPU列表
     *
     * @param brandId 品牌ID
     * @return 商品SPU列表
     */
    List<ProductSpuVO> selectByBrand(Long brandId);
    
    /**
     * 更新商品状态
     *
     * @param id 商品ID
     * @param status 状态
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("updaterId") Long updaterId);
    
    /**
     * 批量更新商品状态
     *
     * @param ids 商品ID列表
     * @param status 状态
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") Integer status, @Param("updaterId") Long updaterId);
    
    /**
     * 批量更新商品推荐状态
     *
     * @param ids 商品ID列表
     * @param isRecommend 推荐状态
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int batchUpdateRecommend(@Param("ids") List<Long> ids, @Param("isRecommend") Boolean isRecommend, @Param("updaterId") Long updaterId);
    
    /**
     * 批量更新商品新品状态
     *
     * @param ids 商品ID列表
     * @param isNew 新品状态
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int batchUpdateNew(@Param("ids") List<Long> ids, @Param("isNew") Boolean isNew, @Param("updaterId") Long updaterId);
    
    /**
     * 批量逻辑删除商品
     *
     * @param ids 商品ID列表
     * @param updaterId 更新人ID
     * @return 影响行数
     */
    int batchDelete(@Param("ids") List<Long> ids, @Param("updaterId") Long updaterId);
    
    /**
     * 统计商品数量
     *
     * @param queryDTO 查询条件
     * @return 商品数量
     */
    int countProducts(ProductSpuPageQueryDTO queryDTO);


    List<NewProductVO> listNewProduct();

    /**
     * 检查分类是否存在
     *
     * @param categoryId 分类ID
     * @return 存在返回1，不存在返回0
     */
    Integer checkCategoryExists(@Param("categoryId") Long categoryId);
}
